.include "record-def.s"
.include "linux.s"

.section .data
# 我们想写入的常量数据
# 每个数据项以空字节0填充到适当的长度

# .rept同于填充每一项。.rept告诉汇编程序将
# .rept和.endr之间的段重复指定次数
# 在这个程序中，此指令用于将多余的空白字符
# 增加到每个字段末尾以将之填满

record1:
    .ascii "Fredrick\0"
    .rept 31    # 填充到40字节
    .byte 0
    .endr

    .ascii "Bartlett\0"
    .rept 31    # 填充到40字节
    .byte 0
    .endr

    .ascii "4242 S Prairie Tulsa, OK 55555\0"
    .rept 209   # 填充到240字节
    .byte 0
    .endr

    .long 45

record2:
    .ascii "\nMarilyn\0"
    .rept 31
    .byte 0
    .endr

    .ascii "Taylor\0"
    .rept 33
    .byte 0
    .endr

    .ascii "2224 S johannan St Chicago, IL 12345\0"
    .rept 203
    .byte 0
    .endr

    .long 29

record3:
    .ascii "\nDerrick\0"
    .rept 31
    .byte 0
    .endr

    .ascii "McIntire\0"
    .rept 31
    .byte 0
    .endr

    .ascii "500 W Oakland San Diego, CA 54321\0"
    .rept 206
    .byte 0
    .endr

    .long 36

# 这是我们要写入文件的文件名
file_name:
    .ascii "test.dat\0"

.equ ST_FILE_DESCRIPTOR, -8

.section .text
.globl _start
_start:
    # 复制栈指针到%rbp
    mov     %rsp, %rbp
    # 为文件描述符分配空间  
    sub     $8, %rsp
    
    # 打开文件
    mov     $SYS_OPEN, %rax
    mov     $file_name, %rbx
    mov     $0101, %rcx     # 本指令表明如果文件不存在则创建
                            # 并打开文件用于写入
    mov     $0666, %rdx
    int     $LINUX_SYSCALL

    # 保存文件描述符
    mov     %rax, ST_FILE_DESCRIPTOR(%rbp)

    # 写第一条记录
    push    ST_FILE_DESCRIPTOR(%rbp)
    push    $record1
    call    write_record
    add     $16, %rsp

    # 写第二条记录
    push    ST_FILE_DESCRIPTOR(%rbp)
    push    $record2
    call    write_record
    add     $16, %rsp

    # 写第三条记录
    push    ST_FILE_DESCRIPTOR(%rbp)
    push    $record3
    call    write_record
    add     $16, %rsp

    push    ST_FILE_DESCRIPTOR(%rbp)
    call    write_newline
    add     $8, %rsp

    # 关闭文件描述符
    mov     $SYS_CLOSE, %rax
    mov     ST_FILE_DESCRIPTOR(%rbp), %rbx  
    int     $LINUX_SYSCALL

    # 退出程序
    mov     $SYS_EXIT, %rax
    mov     $0, %rbx
    int     $LINUX_SYSCALL
